package com.example.newhabitclock.ResetCheckInState

import android.content.Context
import android.os.Build
import androidx.annotation.RequiresApi
import androidx.work.CoroutineWorker
import androidx.work.PeriodicWorkRequestBuilder
import androidx.work.WorkerParameters
import com.example.newhabitclock.HabitRoomPackage.HabitDatabase
import com.example.newhabitclock.HabitRoomPackage.HabitRepository
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
import java.time.Duration
import java.util.concurrent.TimeUnit

//点时任务，每天凌晨12点重置所有习惯的打卡状态为false 使用WorkManager保证任务可靠性，即使应用关闭也能执行
//继承CoroutineWorker支持协程操作数据库

class ResetCheckInWorker(context: Context, params: WorkerParameters) :
    CoroutineWorker(context, params) {
    private val repository = HabitRepository(context)

    //执行实际重置操作的入口方法
    //使用suspend保证数据库操作在协程上下文执行
    override suspend fun doWork(): Result = withContext(Dispatchers.IO) {
        try {
            repository.resetAllCheckIns()
            Result.success()
        } catch (e: Exception) {
            Result.failure()
        }
    }

    companion object {
        // 创建每日凌晨12点触发的WorkRequest
        fun scheduleDailyReset(context: Context) {
            val initialDelayMillis = calculateInitialDelay() // 获取以毫秒为单位的延迟时间
            val dailyRequest = PeriodicWorkRequestBuilder<ResetCheckInWorker>(
                1, // 间隔时间（1天）
                TimeUnit.DAYS
            )
                .setInitialDelay(initialDelayMillis, TimeUnit.MILLISECONDS) // 指定单位
                .build()

            androidx.work.WorkManager.getInstance(context)
                .enqueueUniquePeriodicWork(
                    "DailyResetWork",
                    androidx.work.ExistingPeriodicWorkPolicy.KEEP,
                    dailyRequest
                )
        }

        // 计算距离下一次凌晨12点的延迟时间（返回毫秒）
        private fun calculateInitialDelay(): Long {
            val now = System.currentTimeMillis()
            val calendar = java.util.Calendar.getInstance().apply {
                timeInMillis = now    //将时间设置为now
                add(java.util.Calendar.DAY_OF_YEAR, 1)   //将当前时间设置为明天
                set(java.util.Calendar.HOUR_OF_DAY, 0)  //时间设置为明天的凌晨0点
                set(java.util.Calendar.MINUTE, 0)
                set(java.util.Calendar.SECOND, 0)
                set(java.util.Calendar.MILLISECOND, 0)
            }
            return calendar.timeInMillis - now   //计算当前时间到明天凌晨0点的延迟时间
        }
    }

}